package api

import (
	"gitee.com/shiwjlinux/vblog01/apps/token"
	"gitee.com/shiwjlinux/vblog01/conf"
	"gitee.com/shiwjlinux/vblog01/ioc"
	"gitee.com/shiwjlinux/vblog01/response"
	"github.com/gin-gonic/gin"
)

func init() {
	ioc.Api.Registry(token.AppName, &ApiHandler{})
}

type ApiHandler struct {
	svc token.Service
}

func (a *ApiHandler) Init() error {
	a.svc = ioc.Api.Get(token.AppName).(token.Service)
	subRouter := conf.C().Application.GinRootRouter().Group(token.AppName)
	a.Registry(subRouter)
	return nil
}

func (a *ApiHandler) Registry(subRouter gin.IRouter) {
	subRouter.POST("/", a.Login)
	subRouter.DELETE("/", a.Logout)
}

// Login函数用于处理用户登录请求
func (a *ApiHandler) Login(c *gin.Context) {
	// 创建一个默认的token请求
	req := token.DefaultIssueTokenRequest()
	// 将请求的JSON数据绑定到req变量中
	if err := c.BindJSON(req); err != nil {
		// 如果绑定失败，返回错误信息
		response.Failed(c, err)
		return
	}

	// 调用svc的IssueToken方法，生成token
	tk, err := a.svc.IssueToken(c, req)
	if err != nil {
		// 如果生成token失败，返回错误信息
		response.Failed(c, err)
		return
	}

	// 设置cookie，将token保存到客户端
	c.SetCookie(
		token.COOKIE_TOKEN_KEY,
		tk.AccessToken,
		tk.RefreshTokenExpiredAt,
		"/", "",
		false,
		true,
	)

	// 返回成功信息
	response.Success(c, tk)
}

// Logout函数用于用户登出
func (a *ApiHandler) Logout(c *gin.Context) {
	// 获取cookie中的token
	ak, err := c.Cookie(token.COOKIE_TOKEN_KEY)
	if err != nil {
		// 如果获取失败，返回错误信息
		response.Failed(c, err)
		return
	}

	// 获取请求头中的refresh token
	rt := c.GetHeader(token.X_REFRESH_KEY)
	// 创建RevolkTokenRequest对象
	req := token.NewRevolkTokenRequest(ak, rt)
	// 调用svc的RevolkToken方法，获取token
	tk, err := a.svc.RevolkToken(c, req)
	if err != nil {
		// 如果获取失败，返回错误信息
		response.Failed(c, err)
		return
	}
	// 返回成功信息
	response.Success(c, tk)
}
